#include"gtest/gtest.h"
#include"include/function.h"
// 单元测试类  
class ListTest : public ::testing::Test {  
protected:  
    /*SetUp函数在每个测试用例开始之前都会被自动调用。
    在这里，head被初始化为NULL，意味着在每个测试用例开始之前，都会创建一个空的链表头节点*/
    virtual void SetUp() {  
        // 在这里进行初始化操作，比如创建空的链表等  
        head = NULL;  
    }  
    /*TearDown函数在每个测试用例结束之后都会被自动调用。
    在这里，函数会遍历链表并释放每个节点的内存。*/
    virtual void TearDown() {  
        // 在这里清理资源，比如释放链表内存等  
        LIST temp;  
        while (head != NULL) {  
            temp = head;  
            head = head->next;  
            free(temp);  
        }  
    }  
  
    LIST head; // 用于测试的链表头节点  
};  
// 辅助函数：创建一个包含特定名称的链表节点  
LIST createNode(const char* name) {  
    LIST newNode = (LIST)malloc(sizeof(LN));  
    strcpy(newNode->name, name);  
    newNode->next = NULL;  
    return newNode;  
}  
  
// 测试用例：fundRepeat 应该在链表中找到重复的名称时返回 1  
TEST(FundRepeatTest, fundrepeattest01) {  
    LIST head = createNode("Liming");  
    head->next = createNode("Bob");  
    head->next->next = createNode("Alice"); // 重复名称  
  
    char tempname[] = "Alice";  
    EXPECT_EQ(1, fundRepeat(head, tempname)); // 期望返回 1，因为找到了重复名称  
  
    listfree(&head); // 释放链表内存  
} 
// 测试用例：fundRepeat 应该在链表中找不到重复的名称时返回 0  
TEST(FundRepeatTest, fundrepeattest02) {  
    LIST head = createNode("Alice");  
    head->next = createNode("Bob");  
  
    char tempname[] = "Charlie"; // 链表中不存在的名称  
    EXPECT_EQ(0, fundRepeat(head, tempname)); // 期望返回 0，因为没找到重复名称  
  
    listfree(&head); // 释放链表内存  
}  
// 测试addNode函数的节点添加
TEST_F(ListTest, AddNode)
{
   // 测试添加第一个节点  
    head = addNode(head);  
    ASSERT_NE(head, nullptr); // 确保head不为空  
    EXPECT_EQ(head->next, nullptr); // 确保新节点的next指针为空  
     // 测试节点名字是否正确设置 ，检测search函数的功能
    const char* expectedName = "TestName";  
    LIST p=search(head,expectedName);
    EXPECT_NE(p, nullptr);//检测返回的指针
    //测试添加第二个节点  
    head = addNode(head);  
    ASSERT_NE(head, nullptr);  
    EXPECT_NE(head->next, nullptr); // 第二个节点添加后，head的next不应为空  
    EXPECT_EQ(head->next->next, nullptr); // 确保第二个节点的next指针为空 

}